#include <iostream>
#include <vector>
#include <queue>
#include <stdexcept>
#include <cassert>

using namespace std;

// https://leetcode.cn/problems/perfect-squares/
// 279. 完全平方数
//给你一个整数 n ，返回 和为 n 的完全平方数的最少数量 。
//完全平方数 是一个整数，其值等于另一个整数的平方；换句话说，其值等于一个整数自乘的积。例如，1、4、9 和 16 都是完全平方数，而 3 和 11 不是。

class Solution {
public:
    int numSquares(int n) {

        assert(n > 0);

        queue<pair<int, int>> q;    // 当前
        q.push(make_pair(n, 0));

        vector<bool> visited(n+1, false);
        visited[n] = true;

        while( !q.empty() ) {
            int num = q.front().first;  // 数字是多少
            int step = q.front().second;    //走了几步
            q.pop();

            if(num == 0)
                return step;

            for(int i = 1; num - i*i >= 0; i++) {
                int a = num - i*i;
                if( a < 0)
                    break;
                if(a == 0)
                    return step + 1;
                if(!visited[a]) {
                    q.push(make_pair(a, step + 1));
                    visited[a] = true;
                }
            }

        }

        throw invalid_argument("No Solution.");
    }
};

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
